#pragma once

#include <vex/iterable/range_base.h>
#include <boost/concept_check.hpp>

namespace vex { namespace iterable { namespace concept {
    template <class T>
    class TrivialRange : boost::CopyConstructible<T> {
    public:
        typedef range_traits<T> traits;
        typedef typename traits::range_type range_type;
        typedef typename traits::category category;
        BOOST_CONCEPT_ASSERT((boost::Convertible<category, trivial_range_tag>));
        BOOST_CONCEPT_ASSERT((boost::Convertible<range_type*, range_marker*>));
        BOOST_CONCEPT_USAGE(TrivialRange)
        {
            m_result_of_move_front = m_instance.move_front();
        }
    private:
        T m_instance;
        bool m_result_of_move_front;
    };

}}}